import datetime

import numpy as np
# Create your views here.
import pandas as pd

global conn
from sqlalchemy import create_engine
from tools import comment_tools

conn = create_engine("mysql+pymysql://yinhang:yinghang@123@49.234.83.104:3306/bank_daily?charset=utf8")


# def data_handle(data_table, target_table, comment_handle, challenge_taget=None):
#     # 返回数据
#     '''用于处理数据
#     :param data_table:数据来源表
#     :param target_table:确保目标表
#     :param comment_handle:评论方法
#     :param challenge_taget:挑战目标，默认是None
#     :return:
#     '''
#     # 本地化
#     show_time = datetime.datetime.now()
#     # 时间建构化
#     # now_time = {'month': show_time.month, 'day': show_time.day, 'time': get_half_hour()}
#     # 导入数据来源
#     sql_str_td = "SELECT * FROM {}".format(data_table)
#     td_ct = pd.read_sql(sql=sql_str_td, con=conn)
#     lj_sheet = pd.DataFrame([td_ct['单位'], td_ct['累计达成']]).T
#     lj_sheet['累计达成'] = lj_sheet['累计达成'].astype(float)
#     # 获取确保目标
#     sql_str_tg = "SELECT * FROM 三年期日平台目标"
#     target_sheet = pd.read_sql(sql=sql_str_tg, con=conn)
#     target_sheet['确保目标'] = target_sheet['确保目标'].astype(float)
#     rs = pd.merge(left=lj_sheet, right=target_sheet, on=['单位'], how='outer')
#     rs = rs.fillna(0)
#
#     # 确保达成情况
#     rs['确保缺口'] = rs['确保目标'] - rs['累计达成']
#     rs['确保达成率'] = rs['累计达成'] / rs['确保目标']
#     # 转为百分比
#     # rs['达成率'] = rs['达成率'].apply(lambda x: format(x, '.1%'))
#     # 数据调为整数
#     rs['确保目标'] = rs['确保目标'].astype(int)
#     rs['累计达成'] = rs['累计达成'].astype(int)
#     rs['确保缺口'] = rs['确保缺口'].astype(int)
#     # 根据要求删除数据
#     # rs_html = rs.drop(['缺口', '目标', '达成率'], axis=1)
#     # 按累计达成率排序
#     # qb = rs.sort_values(by=['确保达成率'], ascending=[False])
#     qb = rs.sort_values(by=['累计达成'], ascending=[False])
#     # 转为百分比
#     qb['确保达成率'] = qb['确保达成率'].apply(lambda x: format(x, '.0%'))
#     # 获取挑战目标
#     sql_str_tg = "SELECT * FROM 日平台挑战目标"
#     tz_target = pd.read_sql(sql=sql_str_tg, con=conn)
#     tz_target['挑战目标'] = tz_target['挑战目标'].astype(float)
#     rs = pd.merge(left=qb, right=tz_target, on=['单位'], how='outer')
#     rs = rs.fillna(0)
#     # 确保达成情况
#     rs['挑战缺口'] = rs['挑战目标'] - rs['累计达成']
#     rs['挑战达成率'] = rs['累计达成'] / rs['挑战目标']
#     # 转为百分比
#     # rs['达成率'] = rs['达成率'].apply(lambda x: format(x, '.1%'))
#     # 数据调为整数
#     rs['挑战目标'] = rs['挑战目标'].astype(int)
#     rs['挑战缺口'] = rs['挑战缺口'].astype(int)
#     rs['挑战达成率'] = rs['挑战达成率'].apply(lambda x: format(x, '.0%'))
#     # 删除省公司，后添加到最后一行
#     # 保存全省数据
#     qs_series = rs[rs['单位'].isin(['全省'])].copy()
#     # 判断全省是否达成
#     province_flag = False
#     if qs_series['确保缺口'].values[0] <= 0:
#         province_flag = True
#     # 剔除全省数据
#     rs_html = rs[~rs['单位'].isin(['全省'])]

#     # 获取单位完成数
#     finished_num = len(rs_html[rs_html['确保缺口'] <= 0]['单位'])
#     # 将省公司添加到最后一列
#     rs_html = rs_html.append(qs_series, ignore_index=True)
#
#     # 创建评论
#     # comment = create_comment(rs_html)
#     # 如果时间大于21点增加撤单情况
#     if show_time.hour >= 20:
#         # 获取市公司今日撤单信息
#         sql_str_td = "SELECT * FROM 市公司今日撤单情况"
#         # sql_str_td = "SELECT * FROM demo"
#         cd = pd.read_sql(sql=sql_str_td, con=conn)
#         rs_html = pd.merge(rs_html, cd, on=['单位'])
#         # TODO:添加季度达成情况组成一张大的数据
#     #
#     # result_dict = {'html': rs_html, 'show_time': now_time,
#     #                'comment': '', 'finished_num': finished_num, 'fail_num': 0,
#     #                'province_flag': province_flag}
#     result_dict = {'html': rs_html, 'comment': '', 'fail_num': 0,
#                    'province_flag': province_flag}
#
#     return result_dict

# 简单日展示
def simple_daily():
    compete_show()
    # 获取数据
    return_data = data_handle('市公司三年期日平台数据', '三年期日平台目标', '确保达成率',
                              ['单位', '日平台目标', '当日签单', '当日缺口', '达成率'])
    # return_data = data_handle('市公司日平台数据', '三年期日平台目标', '确保达成率',
    #                           ['单位', '日平台目标', '当日签单', '当日缺口', '达成率'])
    # 生成评论
    comment = comment_tools.daily_commnet('当日签单', '当日缺口', return_data)
    # 生成网页数据
    rs_html = return_data.to_html(classes=['table'], index=False)
    # 生成评论
    return_dict = {
        'html': rs_html,
        'comment': comment
    }
    return return_dict


def month_data():
    # 获取数据
    return_data = data_handle('市公司三年期季度数据', '三年期月度确保目标', '确保达成率',
                              ['单位', '指导目标',
                               '累计达成', '缺口', '达成率'])
    # 生成评论
    comment = comment_tools.month_commnet('累计达成', '缺口', return_data)
    # 生成网页数据
    rs_html = return_data.to_html(classes=['table'], index=False)
    # 生成评论
    return_dict = {
        'html': rs_html,
        'comment': comment
    }
    return return_dict


# 详细日展示
def detail_daily():
    # rs_html = day_data_handle()
    # 添加class样式
    # rs_html['html'] = rs_html['html'].to_html(classes=['detail-table'], index=False)
    # # 获取每日数据
    # rs_html['every_day_html'] = every_day_show().to_html(classes=['detail-table'], index=False)
    # # 显示季度达成情况
    # rs_html['q_html'] = Q_show()
    return {}


# 每日数据展示(列转行)
from pylab import mpl
import matplotlib.pyplot as plt


def every_day_show():
    mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 指定默认字体：解决plot不能显示中文问题
    mpl.rcParams['axes.unicode_minus'] = False
    sql_str_td = "SELECT * FROM daily_save"
    rs = pd.read_sql(sql=sql_str_td, con=conn)
    # 行转列
    rs = rs.pivot('单位', '日期')
    col_li = list(rs.columns.levels[1])
    col = ['单位', col_li]
    # 去除重复索引
    rs.columns = rs.columns.droplevel(0)
    # 去除多重索引
    rs = rs.reset_index()
    rs.columns.name = '序列'
    # 找到地市编码对应表
    sql_str_cc = "SELECT * FROM code_city"
    code_city = pd.read_sql(sql=sql_str_cc, con=conn)
    # 制作每日变化图
    rs = pd.merge(left=code_city, right=rs, on=['单位']).drop(['代码'], axis=1)
    # rs = pd.merge(left=code_city, right=rs, on=['单位']).drop(['单位'], axis=1)
    # 画图
    sheet = rs.set_index('单位', drop=True)
    sheet = sheet.drop('全省')
    # sheet = rs.set_index('代码', drop=True)
    sheet.plot(kind='bar', legend=False)
    plt.savefig(r'static/image/city_every_day.png', dpi=200, bbox_inches='tight')
    return rs


# 数据处理核心
def data_handle(data_table, target_table, sort_value, columns_name=None):
    # 返回数据
    '''
    :param data_table:数据来源
    :param target_table: 目标数据
    :param sort_value:排序栏
    :return:
    '''
    # 本地化
    show_time = datetime.datetime.now()
    # 时间建构化
    # now_time = {'month': show_time.month, 'day': show_time.day, 'time': get_half_hour()}
    # 导入数据来源
    sql_str_td = "SELECT * FROM {}".format(data_table)
    td_ct = pd.read_sql(sql=sql_str_td, con=conn)
    lj_sheet = pd.DataFrame([td_ct['单位'], td_ct['累计达成']]).T
    lj_sheet['累计达成'] = lj_sheet['累计达成'].astype(float)
    # 获取确保目标
    sql_str_tg = "SELECT * FROM {}".format(target_table)
    target_sheet = pd.read_sql(sql=sql_str_tg, con=conn)
    target_sheet['确保目标'] = target_sheet['确保目标'].astype(float)
    # 将目标和实绩进行组合，使用外联防止数据获取失败造成单位数据不对
    rs = pd.merge(left=target_sheet, right=lj_sheet, on=['单位'], how='left')
    rs = rs.fillna(0)
    # 确保达成情况
    rs['确保缺口'] = rs['确保目标'] - rs['累计达成']
    rs['确保达成率'] = rs['累计达成'] / rs['确保目标']
    rs['确保目标'] = rs['确保目标'].astype(int)
    rs['累计达成'] = rs['累计达成'].astype(int)
    rs['确保缺口'] = rs['确保缺口'].astype(int)
    rs = rs.sort_values(by=[sort_value], ascending=[False])
    # 转为百分比
    rs['确保达成率'] = rs['确保达成率'].apply(lambda x: format(x, '.1%'))
    # 删除省公司，后添加到最后一行
    # 保存全省数据
    qs_series = rs[rs['单位'].isin(['全省'])].copy()
    # 判断全省是否达成
    province_flag = False
    if qs_series['确保缺口'].values[0] <= 0:
        province_flag = True
    # 剔除全省数据
    rs_html = rs[~rs['单位'].isin(['全省'])]
    finished_num = len(rs_html[rs_html['确保缺口'] <= 0]['单位'])
    # 将省公司添加到最后一列
    rs_html = rs_html.append(qs_series, ignore_index=True)
    # result_dict返回数据
    # 是否需要修改当前的columns的值
    if columns_name:
        rs_html.columns = columns_name

    # 返回网页数据
    # ssh
    return rs_html


# 对抗数据展示
def compete_show():
    # 获取数据
    three_year_data = data_handle('市公司三年期日平台数据', '三年期日平台目标', '确保达成率',
                                  ['单位', '日平台目标', '当日签单', '当日缺口', '达成率'])
    five_year_data = data_handle('市公司五年期日平台数据', '三年期日平台目标', '确保达成率',
                                 ['单位', '日平台目标', '当日签单', '当日缺口', '达成率'])
    five_year_data = five_year_data[['单位', '当日签单']]
    three_year_data = three_year_data[['单位', '当日签单']]
    # 将三年期和五年期数据融合
    rs = pd.merge(three_year_data, five_year_data, on=['单位'])
    # 替换columns
    rs.columns = ['单位', '三年期', '五年期及以上']
    # 获取战区数据
    sql_str_td = "SELECT * FROM {}".format('战区分配表')
    zq = pd.read_sql(sql=sql_str_td, con=conn)
    # 将战区和今日数据组合
    rs = pd.merge(zq, rs, on=['单位'], how='left')
    # 排序顺序
    list_sorted = ['第一战区', '第二战区', '第三战区', '第四战区', '第五战区', '第六战区', '全省']
    # 对相关列进行自定义排序
    rs['战区'] = rs['战区'].astype('category').cat.set_categories(list_sorted)

    rs = rs.sort_values(by=['战区'], ascending=True)
    # 数据重排
    rs['战区'] = rs['战区'].astype('str')
    # rs = rs.groupby(['战区', '单位']).sum()
    # rs = rs.reset_index(level=1)
    # return_data = data_handle('市公司日平台数据', '三年期日平台目标', '确保达成率',
    #                           ['单位', '日平台目标', '当日签单', '当日缺口', '达成率'])

    # 添加等效保费
    rs['追踪保费合计'] = rs['三年期'] + rs['五年期及以上'] * 2
    # 列的排序顺序
    order_list = ['战区', '单位', '三年期', '五年期及以上', '追踪保费合计']
    # 更换列顺序
    rs = rs[order_list]
    # 生成评论
    comment = comment_tools.compete_commnet(rs)
    # # 生成网页数据
    rs_html = rs.to_html(classes=['table'], table_id='compete_table',
                         index=False)
    # # 生成评论
    return_dict = {
        'html': rs_html,
        'comment': comment
    }
    phases_compete_show()
    return return_dict


# 阶段对抗数据展示
def phases_compete_show():
    # 获取阶段数据
    sql_str_td = "SELECT * FROM {}".format('阶段期交保费')
    jd = pd.read_sql(sql=sql_str_td, con=conn)
    jd['代码'] = jd['代码'].astype(int)

    # 获取匹配表
    sql_str_td = "SELECT * FROM {}".format('code_city')
    cd = pd.read_sql(sql=sql_str_td, con=conn)
    cd['代码'] = cd['代码'].astype(int)
    # 数据合并
    rs = pd.merge(jd, cd, on=['代码'], how='left')

    rs = rs.drop(['代码'], axis=1)
    # # 将三年期和五年期数据融合
    # rs = pd.merge(three_year_data, five_year_data, on=['单位'])
    # # 替换columns
    # rs.columns = ['单位', '三年期', '五年期及以上']
    # 获取战区数据
    sql_str_td = "SELECT * FROM {}".format('战区分配表')
    zq = pd.read_sql(sql=sql_str_td, con=conn)
    # # 将战区和今日数据组合
    rs = pd.merge(zq, rs, on=['单位'], how='left')
    # 战区目标
    sql_str_td = "SELECT * FROM {}".format('战区目标')
    zq_target = pd.read_sql(sql=sql_str_td, con=conn)
    rs = pd.merge(rs, zq_target, on=['战区'], how='left')

    # # 排序顺序
    list_sorted = ['第一战区', '第二战区', '第三战区', '第四战区', '第五战区', '第六战区', '全省']
    # # 对相关列进行自定义排序
    rs['战区'] = rs['战区'].astype('category').cat.set_categories(list_sorted)
    #
    rs = rs.sort_values(by=['战区'], ascending=True)

    # 数据重排
    rs['战区'] = rs['战区'].astype('str')
    # 计算缺口
    # rs['缺口'] = rs['目标'] - rs['追踪合计保费']
    rs = rs.fillna(0)
    # 设置为int
    rs[['目标', '三年期', '五年期及以上', '追踪合计保费']] = rs[['目标', '三年期', '五年期及以上', '追踪合计保费']].astype(int)
    rs['缺口'] = rs['目标'] - rs['追踪合计保费']
    rs = rs.fillna(0)
    # 数据重排目标
    rs = rs[['战区', '目标', '单位', '三年期', '五年期及以上', '追踪合计保费', '缺口']]

    # # rs = rs.groupby(['战区', '单位']).sum()
    # # rs = rs.reset_index(level=1)
    # # return_data = data_handle('市公司日平台数据', '三年期日平台目标', '确保达成率',
    # #                           ['单位', '日平台目标', '当日签单', '当日缺口', '达成率'])
    #
    # # 添加等效保费
    # rs['追踪保费合计'] = rs['三年期'] + rs['五年期及以上'] * 2
    # # 列的排序顺序
    # order_list = ['战区', '单位', '三年期', '五年期及以上', '追踪保费合计']
    # # 更换列顺序
    # rs = rs[order_list]
    # # 生成评论
    # comment = comment_tools.compete_commnet(rs)
    # # # 生成网页数据
    rs_html = rs.to_html(classes=['table'], table_id='compete_table',
                         index=False)
    # # # 生成评论
    return_dict = {
        'html': rs_html,
        'comment': ''
    }
    return return_dict


# 更新队伍数据
def add_staff_analyst(file_path):
    ll = pd.read_excel(file_path, sheet_name='Sheet1')
    # print(ll)
    # 添加市
    ll['人员代码'] = ll['人员代码'].astype(str)
    ll['市'] = ll['人员代码'].str[0:4]
    # 去除内勤人员
    ll = ll[ll['工作类型'] == '外勤']
    # 去除解约人力
    ll = ll[ll['人员状态'] != '解约']
    # ll = ll.sort_values(['入司时间'], ascending=False)
    # 获取的当前人员清单的最新入司时间
    # last_inTime = str(ll['入司时间'].iloc[0])
    # 添加市
    ll['人员代码'] = ll['人员代码'].astype(str)
    ll['市'] = ll['人员代码'].str[0:4]
    # 去除内勤人员
    ll = ll[ll['工作类型'] == '外勤']
    # 去除解约人力
    ll = ll[ll['人员状态'] != '解约']
    ll = ll.sort_values(['入司时间'], ascending=False)
    # 获取的当前人员清单的最新入司时间
    last_inTime = str(ll['入司时间'].iloc[0])
    a = pd.pivot_table(ll, index=['市', '人员状态'], values=['人员代码'], aggfunc=[np.count_nonzero])

    # 行转列
    col_li = list(a.columns.levels[1])
    col = ['市', col_li]
    # 去除重复索引
    a.columns = a.columns.droplevel(0)
    # 去除多重索引
    a = a.reset_index()
    b = a.groupby(['市'], as_index=False).sum()
    # a.columns.name = '序列'
    # b['待解约人力'] = a['人员代码'].shift(-1)
    # 去除签约人力
    a = a[a['人员状态'] != '签约']
    b['预解约人数'] = list(a['人员代码'])
    b['月末目标'] = b['人员代码'] - b['预解约人数']
    # # 去除预解约数据
    # # a = a[a['人员状态']=='签约']
    # # 去除人员状态
    # a = a.drop('人员状态',axis=1)
    # # a.groupby(['市'],as_index=False).sum()
    # 重新设置column
    b.columns = ['代码', '持证人数', '预解约人数', '月末人数']
    # b.iloc[-1] = ['全省', b['签约人数'].sum(), b['预解约人数'].sum(), b['月末人数'].sum()]
    # 添加全省数据
    b = b.append({'代码': '3214', '持证人数': b['持证人数'].sum(),
                  '预解约人数': b['预解约人数'].sum(), '月末人数': b['月末人数'].sum()}, ignore_index=True)
    # 找到地市编码对应表
    sql_str_cc = "SELECT * FROM code_city"
    code_city = pd.read_sql(sql=sql_str_cc, con=conn)
    code_city['代码'] = code_city['代码'].astype(str)
    b['代码'] = b['代码'].astype(str)
    # 制作每日变化图
    rs = pd.merge(left=code_city, right=b, on=['代码'], how='left').drop(['代码'], axis=1)
    # rs.fillna(0)
    rs['月末人数'] = rs['月末人数'].astype(int)
    rs.to_sql('人力概况表', con=conn, if_exists='replace', index=False)
    return 0


# 显示队伍数据
def show_staff_analyst():
    sql_str_td = "SELECT * FROM {}".format('人力概况表')
    rs = pd.read_sql(sql=sql_str_td, con=conn)
    rs_html = rs.to_html(classes=['table'], table_id='compete_table',
                         index=False)
    return {
        'html': rs_html
    }
